package Persistencia;



import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;


import Modelo.Cliente;
import Modelo.Dato;
import Modelo.PaquetedeServicios;
import Modelo.SMS;
import Modelo.Servicio;
import Modelo.Voz;





public class AdministradorPersistenciaServico 
{
	private static AdministradorPersistenciaServico pool;
	
	
	private AdministradorPersistenciaServico()
	{
		
	}
	
	public static AdministradorPersistenciaServico getInstancia()
	{
		if (pool== null)
			pool =new AdministradorPersistenciaServico();
		return pool;
	}
	
	public Vector<String> cargarComboSrv(String srv)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Vector<String> vListaComboSms = new Vector<String>();
		String vLista [][] = {};
		
		String vComboSms = null;
		String vId = null;
		//Generar sentencia SQL
		try
		{
			String senten = "SELECT idservicio, nombre from servicio where tipo_srv = ? " ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setString(1,srv);
			ResultSet result = ps.executeQuery();
			
			while (result.next())
			{
				/*vComboSms = result.getString("nombre");
				vListaComboSms.add(vComboSms);
				vComboSms = null;*/
				
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return vListaComboSms;		
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return null;
	}

	public void insertSrv(SMS s)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Servicio (id, nombre, tipo, unidad, costo, valor_unidad, unidad_Libres, descuento) VALUES (?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, s.getId());
			ps.setString(2,s.getNombre());
			ps.setString(3,s.getTipo());
			ps.setString(4,s.getUnidad());
			ps.setFloat(5,s.getCosto());
			ps.setFloat(6,s.getValorSms());
			ps.setInt(7,s.getCantidadSmsLibre());
			ps.setFloat(8,0);
			ps.execute();		
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	public void insertSrv(Dato d)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Servicio (id, nombre, tipo, unidad, costo, valor_unidad, unidad_Libres, descuento) VALUES (?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, d.getId());
			ps.setString(2,d.getNombre());
			ps.setString(3,d.getTipo());
			ps.setString(4,d.getUnidad());
			ps.setFloat(5,d.getCosto());
			ps.setFloat(6,d.getValorKb());
			ps.setInt(7,d.getCantidadKbLibre());
			ps.setFloat(8,0);
			ps.execute();		
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	public void insertSrv(Voz v)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Servicio (id, nombre, tipo, unidad, costo, valor_unidad, unidad_Libres, descuento) VALUES (?,?,?,?,?,?,?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, v.getId());
			ps.setString(2,v.getNombre());
			ps.setString(3,v.getTipo());
			ps.setString(4,v.getUnidad());
			ps.setFloat(5,v.getCosto());
			ps.setFloat(6,v.getValorMinVoz());
			ps.setInt(7,v.getCantidadMinVozLibre());
			ps.setFloat(8,0);
			ps.execute();		
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	
	public void insertSrv(PaquetedeServicios p)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			String senten = "INSERT INTO Servicio (id, nombre, tipo, unidad, costo, valor_unidad, unidad_Libres, descuento) VALUES (?,?,?,?,0,0,0,?)" ;
			String senten2 = "INSERT INTO SERVICIO_PAQUETE (servicio_id, paquete_id) VALUES (?,?)" ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1, p.getId());
			ps.setString(2,p.getNombre());
			ps.setString(3,p.getTipo());
			ps.setString(4,p.getUnidad());
			ps.setFloat(5,p.getDescuento());
			ps.execute();
			for (int i = 0; i < p.getServicios().size(); i++) 
			{ 
				PreparedStatement ps2 = null;
				ps2 = con.prepareStatement(senten2);
				ps2.setInt(1, p.getServicios().elementAt(i).getId());
				ps2.setInt(2,p.getId());
				ps2.execute();
			} 
			PoolConnection.getPoolConnection().realeaseConnection(con);
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      
	}
	
	
	
	
	
	
	public Vector<Servicio> cargaServicios()
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		Vector<Servicio> listaServicios = new Vector<Servicio>();
		//Generar sentencia SQL
		try
		{
			//Preparar sentencia insert en tabla destino
			
			String senten = "select * from SERVICIO";
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ResultSet result = ps.executeQuery();
			while (result.next())
			
			{   
				System.out.print(result.getString("tipo"));
				if (result.getString("tipo").equalsIgnoreCase("SMS"))
				{
					SMS s = new SMS(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					listaServicios.add(s);
				}
				else if (result.getString("tipo").equalsIgnoreCase("DATOS"))
				{
					Dato d = new Dato(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					listaServicios.add(d);
				}
				else if (result.getString("tipo").equalsIgnoreCase("VOZ"))
				{
					Voz v = new Voz(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					listaServicios.add(v);
				}
				else if (result.getString("tipo").equalsIgnoreCase("PAQUETE"))
				{
					PaquetedeServicios pDeSrv= new PaquetedeServicios(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo"), result.getFloat("descuento"));
					String senten2 = "select * from SERVICIO_PAQUETE where paquete_id = ?";
					PreparedStatement ps2 = null;
					ps2 = con.prepareStatement(senten2);
					ps2.setInt(1, result.getInt("id"));
					ResultSet result2 = ps2.executeQuery();
					while (result2.next())
						{
						pDeSrv.getServicios().add(buscarServicioporId(result2.getInt("servicio_id")));
						}	
					listaServicios.add(pDeSrv);
				}
				
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return listaServicios;	
		
			
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Insertar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Insertar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
		return listaServicios;
	      
	}
	
	
	
	public Servicio buscarServicioporId(int id)
	{
		//Obtener conexion BD 
		Connection con = PoolConnection.getPoolConnection().getConnection();
		//Generar sentencia SQL
		try
		{
			String senten = "SELECT * from servicio where id = ? " ;
			PreparedStatement ps = null;
			ps = con.prepareStatement(senten);
			ps.setInt(1,id);
			ResultSet result = ps.executeQuery();
			
			while (result.next())
			{
				if (result.getString("tipo").equalsIgnoreCase("SMS") )
				{
					SMS s = new SMS(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					return s;
				}
				else if (result.getString("tipo").equalsIgnoreCase("DATOS"))
				{
					Dato d = new Dato(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					return d;
				}
				else if (result.getString("tipo").equalsIgnoreCase("VOZ"))
				{
					Voz v = new Voz(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo") , result.getFloat("valor_unidad"), result.getInt("unidad_Libres"), result.getFloat("costo"));
					return v;
				}
				
				else if (result.getString("tipo").equalsIgnoreCase("PAQUETE"))
				{
					PaquetedeServicios pDeSrv= new PaquetedeServicios(result.getInt("id"), result.getString("unidad"), result.getString("nombre"), result.getString("tipo"), result.getFloat("descuento"));
					String senten2 = "select * from SERVICIO_PAQUETE where paquete_id = ?";
					PreparedStatement ps2 = null;
					ps2 = con.prepareStatement(senten2);
					ps2.setInt(1, result.getInt("id"));
					ResultSet result2 = ps2.executeQuery();
					while (result2.next())
						{
						pDeSrv.getServicios().add(buscarServicioporId(result2.getInt("servicio_id")));
						}	
					return pDeSrv;
				}
				
				
				
				
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return null;		
		}
	      catch( SQLException e ) 
	      {
				System.out.println("Mensaje Error al Borrar Cliente: " + e.getMessage());
				System.out.println("Stack Trace al Borrar Cliente: " + e.getStackTrace());
				PoolConnection.getPoolConnection().realeaseConnection(con);
	      }
	      return null;
	}
	
	
	
	
}
